<!DOCTYPE html>
<html lang="en" dir="ltr" class="client-nojs">
<head>
<title>Value categories - cppreference.com</title>
<meta charset="UTF-8">
<meta name="generator" content="MediaWiki 1.21.2">
<link rel="shortcut icon" href="../../../common/favicon.ico">
<link rel="stylesheet" href="../../../common/ext.css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" href="../../../common/site_modules.css">
<style>a:lang(ar),a:lang(ckb),a:lang(fa),a:lang(kk-arab),a:lang(mzn),a:lang(ps),a:lang(ur){text-decoration:none}#toc{display:none}.editsection{display:none}
/* cache key: mwiki1-mwiki_en_:resourceloader:filter:minify-css:7:472787eddcf4605d11de8c7ef047234f */</style>

<script src="../../../common/startup_scripts.js"></script>
<script>if(window.mw){
mw.config.set({"wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"cpp/language/value_category","wgTitle":"cpp/language/value category","wgCurRevisionId":140338,"wgArticleId":4706,"wgIsArticle":true,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":[],"wgBreakFrames":false,"wgPageContentLanguage":"en","wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy","wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgMonthNamesShort":["","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],"wgRelevantPageName":"cpp/language/value_category","wgRestrictionEdit":[],"wgRestrictionMove":[]});
}</script><script>if(window.mw){
mw.loader.implement("user.options",function(){mw.user.options.set({"ccmeonemails":0,"cols":80,"date":"default","diffonly":0,"disablemail":0,"disablesuggest":0,"editfont":"default","editondblclick":0,"editsection":0,"editsectiononrightclick":0,"enotifminoredits":0,"enotifrevealaddr":0,"enotifusertalkpages":1,"enotifwatchlistpages":0,"extendwatchlist":0,"externaldiff":0,"externaleditor":0,"fancysig":0,"forceeditsummary":0,"gender":"unknown","hideminor":0,"hidepatrolled":0,"imagesize":2,"justify":0,"math":1,"minordefault":0,"newpageshidepatrolled":0,"nocache":0,"noconvertlink":0,"norollbackdiff":0,"numberheadings":0,"previewonfirst":0,"previewontop":1,"quickbar":5,"rcdays":7,"rclimit":50,"rememberpassword":0,"rows":25,"searchlimit":20,"showhiddencats":0,"showjumplinks":1,"shownumberswatching":1,"showtoc":0,"showtoolbar":1,"skin":"cppreference2","stubthreshold":0,"thumbsize":2,"underline":2,"uselivepreview":0,"usenewrc":0,"watchcreations":0,"watchdefault":0,"watchdeletion":0,
"watchlistdays":3,"watchlisthideanons":0,"watchlisthidebots":0,"watchlisthideliu":0,"watchlisthideminor":0,"watchlisthideown":0,"watchlisthidepatrolled":0,"watchmoves":0,"wllimit":250,"variant":"en","language":"en","searchNs0":true,"searchNs1":false,"searchNs2":false,"searchNs3":false,"searchNs4":false,"searchNs5":false,"searchNs6":false,"searchNs7":false,"searchNs8":false,"searchNs9":false,"searchNs10":false,"searchNs11":false,"searchNs12":false,"searchNs13":false,"searchNs14":false,"searchNs15":false,"gadget-ColiruCompiler":1,"gadget-MathJax":1});;},{},{});mw.loader.implement("user.tokens",function(){mw.user.tokens.set({"editToken":"+\\","patrolToken":false,"watchToken":false});;},{},{});
/* cache key: mwiki1-mwiki_en_:resourceloader:filter:minify-js:7:9f05c6caceb9bb1a482b6cebd4c5a330 */
}</script>
<script>if(window.mw){
mw.loader.load(["mediawiki.page.startup","mediawiki.legacy.wikibits","mediawiki.legacy.ajax"]);
}</script>
<style type="text/css">/*<![CDATA[*/
.source-cpp {line-height: normal;}
.source-cpp li, .source-cpp pre {
	line-height: normal; border: 0px none white;
}
/**
 * GeSHi Dynamically Generated Stylesheet
 * --------------------------------------
 * Dynamically generated stylesheet for cpp
 * CSS class: source-cpp, CSS id: 
 * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
 * (http://qbnz.com/highlighter/ and http://geshi.org/)
 * --------------------------------------
 */
.cpp.source-cpp .de1, .cpp.source-cpp .de2 {font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;}
.cpp.source-cpp  {font-family:monospace;}
.cpp.source-cpp .imp {font-weight: bold; color: red;}
.cpp.source-cpp li, .cpp.source-cpp .li1 {font-weight: normal; vertical-align:top;}
.cpp.source-cpp .ln {width:1px;text-align:right;margin:0;padding:0 2px;vertical-align:top;}
.cpp.source-cpp .li2 {font-weight: bold; vertical-align:top;}
.cpp.source-cpp .kw1 {color: #0000dd;}
.cpp.source-cpp .kw2 {color: #0000ff;}
.cpp.source-cpp .kw3 {color: #0000dd;}
.cpp.source-cpp .kw4 {color: #0000ff;}
.cpp.source-cpp .co1 {color: #909090;}
.cpp.source-cpp .co2 {color: #339900;}
.cpp.source-cpp .coMULTI {color: #ff0000; font-style: italic;}
.cpp.source-cpp .es0 {color: #008000; font-weight: bold;}
.cpp.source-cpp .es1 {color: #008000; font-weight: bold;}
.cpp.source-cpp .es2 {color: #008000; font-weight: bold;}
.cpp.source-cpp .es3 {color: #008000; font-weight: bold;}
.cpp.source-cpp .es4 {color: #008000; font-weight: bold;}
.cpp.source-cpp .es5 {color: #008000; font-weight: bold;}
.cpp.source-cpp .br0 {color: #008000;}
.cpp.source-cpp .sy0 {color: #008000;}
.cpp.source-cpp .sy1 {color: #000080;}
.cpp.source-cpp .sy2 {color: #000040;}
.cpp.source-cpp .sy3 {color: #000040;}
.cpp.source-cpp .sy4 {color: #008080;}
.cpp.source-cpp .st0 {color: #008000;}
.cpp.source-cpp .nu0 {color: #000080;}
.cpp.source-cpp .nu6 {color: #000080;}
.cpp.source-cpp .nu8 {color: #000080;}
.cpp.source-cpp .nu12 {color: #000080;}
.cpp.source-cpp .nu16 {color:#000080;}
.cpp.source-cpp .nu17 {color:#000080;}
.cpp.source-cpp .nu18 {color:#000080;}
.cpp.source-cpp .nu19 {color:#000080;}
.cpp.source-cpp .ln-xtra, .cpp.source-cpp li.ln-xtra, .cpp.source-cpp div.ln-xtra {background-color: #ffc;}
.cpp.source-cpp span.xtra { display:block; }

/*]]>*/
</style><!--[if lt IE 7]><style type="text/css">body{behavior:url("/mwiki/skins/cppreference2/csshover.min.htc")}</style><![endif]--></head>
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_language_value_category skin-cppreference2 action-view cpp-navbar">
        <!-- header -->
        <!-- /header -->
        <!-- content -->
<div id="cpp-content-base">
            <div id="content">
                <a id="top"></a>
                <div id="mw-js-message" style="display:none;"></div>
                                <!-- firstHeading -->
<h1 id="firstHeading" class="firstHeading">Value categories</h1>
                <!-- /firstHeading -->
                <!-- bodyContent -->
                <div id="bodyContent">
                                        <!-- tagline -->
                    <div id="siteSub">From cppreference.com</div>
                    <!-- /tagline -->
                                        <!-- subtitle -->
                    <div id="contentSub"><span class="subpages">&lt; <a href="../../cpp.html" title="cpp">cpp</a>‎ | <a href="../language.html" title="cpp/language">language</a></span></div>
                    <!-- /subtitle -->
                                                            <!-- bodycontent -->
                    <div id="mw-content-text" lang="en" dir="ltr" class="mw-content-ltr"><div class="t-navbar" style=""><div class="t-navbar-sep"> </div><div class="t-navbar-head"><a href="../../cpp.html" title="cpp"> C++</a><div class="t-navbar-menu"><div><div><table class="t-nv-begin" cellpadding="0" style="line-height:1.1em;">
<tr class="t-nv"><td colspan="5"> <a href="../compiler_support.html" title="cpp/compiler support"> Compiler support</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../freestanding.html" title="cpp/freestanding"> Freestanding and hosted</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../language.html" title="cpp/language"> Language</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../header.html" title="cpp/header"> Standard library headers</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../named_req.html" title="cpp/named req"> Named requirements </a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../feature_test.html" title="cpp/feature test"> Feature test macros </a> <span class="t-mark-rev t-since-cxx20">(C++20)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../utility.html#Language_support" title="cpp/utility"> Language support library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../concepts.html" title="cpp/concepts"> Concepts library</a> <span class="t-mark-rev t-since-cxx20">(C++20)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../meta.html" title="cpp/meta"> Metaprogramming library</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../error.html" title="cpp/error"> Diagnostics library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../utility.html" title="cpp/utility"> General utilities library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../string.html" title="cpp/string"> Strings library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../container.html" title="cpp/container"> Containers library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../iterator.html" title="cpp/iterator"> Iterators library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../ranges.html" title="cpp/ranges"> Ranges library</a> <span class="t-mark-rev t-since-cxx20">(C++20)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../algorithm.html" title="cpp/algorithm"> Algorithms library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../numeric.html" title="cpp/numeric"> Numerics library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../locale.html" title="cpp/locale"> Localizations library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../io.html" title="cpp/io"> Input/output library</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../filesystem.html" title="cpp/filesystem"> Filesystem library</a> <span class="t-mark-rev t-since-cxx17">(C++17)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../regex.html" title="cpp/regex"> Regular expressions library</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../thread.html" title="cpp/thread"> Concurrency support library</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../experimental.html" title="cpp/experimental"> Technical specifications</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../symbol_index.html" title="cpp/symbol index"> Symbols index</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../links/libs.html" title="cpp/links/libs"> External libraries</a> </td></tr>
</table></div><div></div></div></div></div><div class="t-navbar-sep"> </div><div class="t-navbar-head"><a href="../language.html" title="cpp/language"> C++ language</a><div class="t-navbar-menu"><div><div style="display:inline-block">
<div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv-h1"><td colspan="5"> General topics</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="../preprocessor.html" title="cpp/preprocessor"> Preprocessor</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="../comments.html" title="cpp/comment"> Comments</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="../keywords.html" title="cpp/keyword"> Keywords</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="escape.html" title="cpp/language/escape"> Escape sequences</a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h1"><td colspan="5"> <a href="statements.html" title="cpp/language/statements"> Flow control</a></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Conditional execution statements</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="if.html" title="cpp/language/if"><tt>if</tt></a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="switch.html" title="cpp/language/switch"><tt>switch</tt></a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Iteration statements (loops)</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="for.html" title="cpp/language/for"><tt>for</tt></a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="range-for.html" title="cpp/language/range-for"> range-<code>for</code></a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="while.html" title="cpp/language/while"><tt>while</tt></a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="do.html" title="cpp/language/do"> <code>do-while</code></a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Jump statements </td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="continue.html" title="cpp/language/continue"><tt>continue</tt></a> - <a href="break.html" title="cpp/language/break"><tt>break</tt></a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="goto.html" title="cpp/language/goto"><tt>goto</tt></a> - <a href="return.html" title="cpp/language/return"><tt>return</tt></a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h1"><td colspan="5"> <a href="functions.html" title="cpp/language/functions"> Functions</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="function.html" title="cpp/language/function"> Function declaration</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="lambda.html" title="cpp/language/lambda"> Lambda function expression</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="inline.html" title="cpp/language/inline"> <code>inline</code> specifier</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="except_spec.html" title="cpp/language/except spec"> Dynamic exception specifications</a> <span class="t-mark-rev t-until-cxx20">(until C++20)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="noexcept_spec.html" title="cpp/language/noexcept spec"> <code>noexcept</code> specifier</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv-h1"><td colspan="5"> Exceptions</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="throw.html" title="cpp/language/throw"> <code>throw</code>-expression</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="try_catch.html" title="cpp/language/try catch"> <code>try</code>-<code>catch</code> block</a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h1"><td colspan="5"> Namespaces</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="namespace.html" title="cpp/language/namespace"> Namespace declaration</a>  </td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="namespace_alias.html" title="cpp/language/namespace alias"> Namespace aliases</a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h1"><td colspan="5"> Types</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="types.html" title="cpp/language/types"> Fundamental types</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="enum_class.html" title="cpp/language/enum"> Enumeration types</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="function.html" title="cpp/language/function"> Function types</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="class.html" title="cpp/language/class"> Class/struct types</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="union.html" title="cpp/language/union"> Union types</a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Specifiers</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="decltype.html" title="cpp/language/decltype"><tt>decltype</tt></a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="auto.html" title="cpp/language/auto"><tt>auto</tt></a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="alignas.html" title="cpp/language/alignas"><tt>alignas</tt></a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="cv.html" title="cpp/language/cv"> <code>const</code>/<code>volatile</code></a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="constexpr.html" title="cpp/language/constexpr"><tt>constexpr</tt></a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
</table></div></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="storage_duration.html" title="cpp/language/storage duration"> Storage duration specifiers</a></td></tr>
<tr class="t-nv-h2"><td colspan="5"> <a href="initialization.html" title="cpp/language/initialization"> Initialization</a></td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="default_initialization.html" title="cpp/language/default initialization"> Default initialization</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="value_initialization.html" title="cpp/language/value initialization"> Value initialization</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="zero_initialization.html" title="cpp/language/zero initialization"> Zero initialization</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="copy_initialization.html" title="cpp/language/copy initialization"> Copy initialization</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="direct_initialization.html" title="cpp/language/direct initialization"> Direct initialization</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="aggregate_initialization.html" title="cpp/language/aggregate initialization"> Aggregate initialization</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="list_initialization.html" title="cpp/language/list initialization"> List initialization</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="constant_initialization.html" title="cpp/language/constant initialization"> Constant initialization</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="reference_initialization.html" title="cpp/language/reference initialization"> Reference initialization</a></td></tr>
</table></div></td></tr>
</table></div>
</div>
<div style="display:inline-block">
<div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv-h1"><td colspan="5"> <a href="expressions.html" title="cpp/language/expressions"> Expressions</a></td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <strong class="selflink"> Value categories</strong></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="eval_order.html" title="cpp/language/eval order"> Order of evaluation</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="operators.html" title="cpp/language/operators"> Operators</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operator_precedence.html" title="cpp/language/operator precedence"> Operator precedence</a></td></tr>
</table></div></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operator_alternative.html" title="cpp/language/operator alternative"> Alternative representations</a></td></tr>
<tr class="t-nv-h2"><td colspan="5"> <a href="expressions.html#Literals" title="cpp/language/expressions"> Literals</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="bool_literal.html" title="cpp/language/bool literal"> Boolean</a> - <a href="integer_literal.html" title="cpp/language/integer literal"> Integer</a> - <a href="floating_literal.html" title="cpp/language/floating literal"> Floating-point</a></td></tr>   
<tr class="t-nv"><td colspan="5"> <a href="character_literal.html" title="cpp/language/character literal"> Character</a> - <a href="string_literal.html" title="cpp/language/string literal"> String</a> - <a href="nullptr.html" title="cpp/language/nullptr"><tt>nullptr</tt></a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr> 
<tr class="t-nv"><td colspan="5"> <a href="user_literal.html" title="cpp/language/user literal"> User-defined</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv-h1"><td colspan="5"> Utilities</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="attributes.html" title="cpp/language/attributes"> Attributes</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Types</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="typedef.html" title="cpp/language/typedef"> <code>typedef</code> declaration</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="type_alias.html" title="cpp/language/type alias"> Type alias declaration</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Casts</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="implicit_cast.html" title="cpp/language/implicit conversion"> Implicit conversions</a> - <a href="explicit_cast.html" title="cpp/language/explicit cast"> Explicit conversions</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="static_cast.html" title="cpp/language/static cast"><tt>static_cast</tt></a> - <a href="dynamic_cast.html" title="cpp/language/dynamic cast"><tt>dynamic_cast</tt></a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="const_cast.html" title="cpp/language/const cast"><tt>const_cast</tt></a> - <a href="reinterpret_cast.html" title="cpp/language/reinterpret cast"><tt>reinterpret_cast</tt></a></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Memory allocation</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="new.html" title="cpp/language/new"> <code>new</code> expression</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="delete.html" title="cpp/language/delete"> <code>delete</code> expression</a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h1"><td colspan="5"> <a href="classes.html" title="cpp/language/classes"> Classes</a></td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="class.html" title="cpp/language/class"> Class declaration</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="initializer_list.html" title="cpp/language/constructor"> Constructors</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="this.html" title="cpp/language/this"> <code>this</code> pointer</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="access.html" title="cpp/language/access"> Access specifiers</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="friend.html" title="cpp/language/friend"> <code>friend</code> specifier</a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Class-specific function properties</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="virtual.html" title="cpp/language/virtual"> Virtual function</a> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="override.html" title="cpp/language/override"> <code>override</code> specifier</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="final.html" title="cpp/language/final"> <code>final</code> specifier</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="explicit.html" title="cpp/language/explicit"><tt>explicit</tt></a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="static.html" title="cpp/language/static"><tt>static</tt></a> </td></tr>
</table></div></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Special member functions</td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="default_constructor.html" title="cpp/language/default constructor"> Default constructor</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="copy_constructor.html" title="cpp/language/copy constructor"> Copy constructor</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="move_constructor.html" title="cpp/language/move constructor"> Move constructor</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="as_operator.html" title="cpp/language/as operator" class="mw-redirect"> Copy assignment</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="move_operator.html" title="cpp/language/move operator" class="mw-redirect"> Move assignment</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="destructor.html" title="cpp/language/destructor"> Destructor</a></td></tr>
</table></div></td></tr>
<tr class="t-nv-h1"><td colspan="5"><a href="templates.html" title="cpp/language/templates"> Templates</a> </td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="class_template.html" title="cpp/language/class template"> Class template </a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="function_template.html" title="cpp/language/function template"> Function template </a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="template_specialization.html" title="cpp/language/template specialization"> Template specialization</a></td></tr>   
<tr class="t-nv"><td colspan="5"> <a href="parameter_pack.html" title="cpp/language/parameter pack"> Parameter packs</a> <span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
</table></div></td></tr>
<tr class="t-nv-h1"><td colspan="5"> Miscellaneous </td></tr>
<tr class="t-nv-col-table"><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="asm.html" title="cpp/language/asm"> Inline assembly</a></td></tr>
</table></div></td><td><div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv"><td colspan="5"> <a href="history.html" title="cpp/language/history"> History of C++</a></td></tr>
</table></div></td></tr>
</table></div>
</div><div></div></div></div></div><div class="t-navbar-sep"> </div><div class="t-navbar-head"><a href="expressions.html" title="cpp/language/expressions"> Expressions</a><div class="t-navbar-menu"><div><div style="display:inline-block">
<div><table class="t-nv-begin" cellpadding="0" style="">
<tr class="t-nv-h2"><td colspan="5"> General </td></tr>
<tr class="t-nv"><td colspan="5"> <strong class="selflink"> value categories</strong> (lvalue, rvalue, xvalue)</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="eval_order.html" title="cpp/language/eval order"> order of evaluation</a> (sequence points)</td></tr>
<tr class="t-nv"><td colspan="5"> <a href="constant_expression.html" title="cpp/language/constant expression"> constant expressions</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="expressions.html#Unevaluated_expressions" title="cpp/language/expressions"> unevaluated expressions</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="expressions.html#Primary_expressions" title="cpp/language/expressions"> primary expressions</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="lambda.html" title="cpp/language/lambda">lambda-expression</a><span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Literals </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="integer_literal.html" title="cpp/language/integer literal">integer literals</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="floating_literal.html" title="cpp/language/floating literal">floating-point literals</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="bool_literal.html" title="cpp/language/bool literal">boolean literals</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="character_literal.html" title="cpp/language/character literal">character literals</a> including <a href="escape.html" title="cpp/language/escape">escape sequences</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="string_literal.html" title="cpp/language/string literal">string literals</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="nullptr.html" title="cpp/language/nullptr">null pointer literal</a><span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="user_literal.html" title="cpp/language/user literal">user-defined literal</a><span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Operators </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operator_assignment.html" title="cpp/language/operator assignment"> Assignment operators</a>: 
<code>a=b</code>, <code>a+=b</code>, <code>a-=b</code>, <code>a*=b</code>, <code>a/=b</code>, <code>a%=b</code>, <code>a&amp;=b</code>, <code>a|=b</code>, <code>a^=b</code>, <code>a&lt;&lt;=b</code>, <code>a&gt;&gt;=b</code></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operator_incdec.html" title="cpp/language/operator incdec"> Increment and decrement</a>: <code>++a</code>, <code>--a</code>, <code>a++</code>, <code>a--</code></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operator_arithmetic.html" title="cpp/language/operator arithmetic"> Arithmetic operators</a>:
<code>+a</code>, <code>-a</code>, <code>a+b</code>, <code>a-b</code>, <code>a*b</code>, <code>a/b</code>, <code>a%b</code>, <code>~a</code>, <code>a&amp;b</code>, <code>a|b</code>, <code>a^b</code>, <code>a&lt;&lt;b</code>, <code>a&gt;&gt;b</code> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operator_logical.html" title="cpp/language/operator logical"> Logical operators</a>: <code>a||b</code>, <code>a&amp;&amp;b</code>, <code>!a</code></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operator_comparison.html" title="cpp/language/operator comparison"> Comparison operators</a>: <code>a==b</code>, <code>a!=b</code>, <code>a&lt;b</code>, <code>a&gt;b</code>, <code>a&lt;=b</code>, <code>a&gt;=b</code>, <code>a&lt;=&gt;b</code><span class="t-mark-rev t-since-cxx20">(C++20)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operator_member_access.html" title="cpp/language/operator member access"> Member access operators</a>: <code>a[b]</code>, <code>*a</code>, <code>&amp;a</code>, <code>a-&gt;b</code>, <code>a.b</code>, <code>a-&gt;*b</code>, <code>a.*b</code></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operator_other.html" title="cpp/language/operator other"> Other operators</a>: <code>a(...)</code>, <code>a,b</code>, <code>a?b:c</code> </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="new.html" title="cpp/language/new">new-expression</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="delete.html" title="cpp/language/delete">delete-expression</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="throw.html" title="cpp/language/throw">throw-expression</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="alignof.html" title="cpp/language/alignof"><code>alignof</code></a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="sizeof.html" title="cpp/language/sizeof"><code>sizeof</code></a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="sizeof....html" title="cpp/language/sizeof..."><code>sizeof...</code></a><span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="typeid.html" title="cpp/language/typeid"><code>typeid</code></a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="noexcept.html" title="cpp/language/noexcept"><code>noexcept</code></a><span class="t-mark-rev t-since-cxx11">(C++11)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="fold.html" title="cpp/language/fold">Fold expression</a><span class="t-mark-rev t-since-cxx17">(C++17)</span></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operator_alternative.html" title="cpp/language/operator alternative">Alternative representations of operators</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operator_precedence.html" title="cpp/language/operator precedence">Precedence and associativity</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="operators.html" title="cpp/language/operators">Operator overloading</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="default_comparisons.html" title="cpp/language/default comparisons">Default comparisons</a><span class="t-mark-rev t-since-cxx20">(C++20)</span></td></tr>
<tr class="t-nv-h2"><td colspan="5"> Conversions </td></tr>
<tr class="t-nv"><td colspan="5"> <a href="implicit_cast.html" title="cpp/language/implicit conversion">Implicit conversions</a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="const_cast.html" title="cpp/language/const cast"><code>const_cast</code></a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="static_cast.html" title="cpp/language/static cast"><code>static_cast</code></a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="reinterpret_cast.html" title="cpp/language/reinterpret cast"><code>reinterpret_cast</code></a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="dynamic_cast.html" title="cpp/language/dynamic cast"><code>dynamic_cast</code></a></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="explicit_cast.html" title="cpp/language/explicit cast">Explicit conversions</a> <code>(T)a</code>, <code>T(a)</code></td></tr>
<tr class="t-nv"><td colspan="5"> <a href="cast_operator.html" title="cpp/language/cast operator">User-defined conversion</a></td></tr>
</table></div>
</div><div></div></div></div></div><div class="t-navbar-sep"> </div></div>
<p>Each C++ <a href="expressions.html" title="cpp/language/expressions">expression</a> (an operator with its operands, a literal, a variable name, etc.) is characterized by two independent properties: a <i><a href="type-id.html" title="cpp/language/type">type</a></i> and a <i>value category</i>. Each expression has some non-reference type, and each expression belongs to exactly one of the three primary value categories: <i>prvalue</i>, <i>xvalue</i>, and <i>lvalue</i>.
</p>
<ul><li> a glvalue (“generalized” lvalue) is an expression whose evaluation determines the identity of an object or function;
</li><li> a prvalue (“pure” rvalue) is an expression whose evaluation
</li></ul>
<dl><dd><ul><li> computes the value of an operand of a built-in operator (such prvalue has no <i>result object</i>), or
</li><li> initializes an object (such prvalue is said to have a <i>result object</i>).
</li></ul>
<dl><dd> The result object may be a variable, an object created by <a href="new.html" title="cpp/language/new">new-expression</a>, a temporary created by <a href="implicit_cast.html#Temporary_materialization" title="cpp/language/implicit conversion">temporary materialization</a>, or a member thereof. Note that non-<span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span></span></span> <a href="expressions.html#Discarded-value_expressions" title="cpp/language/expressions">discarded</a> expressions have a result object (the materialized temporary). Also, every class and array prvalue has a result object except when it is the operand of <a href="decltype.html" title="cpp/language/decltype">decltype</a>;
</dd></dl>
</dd></dl>
<ul><li> an xvalue (an “eXpiring” value) is a glvalue that denotes an object whose resources can be reused;
</li><li> an lvalue (so-called, historically, because lvalues could appear on the left-hand side of an assignment expression) is a glvalue that is not an xvalue;
</li><li> an rvalue (so-called, historically, because rvalues could appear on the right-hand side of an assignment expression) is a prvalue or an xvalue.
</li></ul>
<p>Note: this taxonomy went through significant changes with past C++ standard revisions, see <a href="value_category.html#History">History</a> below for details.
</p>
<h3><span class="mw-headline" id="Primary_categories">Primary categories</span></h3>
<h4><span class="mw-headline" id="lvalue">lvalue</span></h4>
<p>The following expressions are <i>lvalue expressions</i>:
</p>
<ul><li> the name of a variable, a function<span class="t-rev-inl t-since-cxx20"><span>, a <a href="template_parameters.html#Non-type_template_parameter" title="cpp/language/template parameters">template parameter object</a></span> <span><span class="t-mark-rev t-since-cxx20">(since C++20)</span></span></span>, or a data member, regardless of type, such as <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="../io/cin.html"><span class="kw1760">std::<span class="me2">cin</span></span></a></span></span> or <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="../io/manip/endl.html"><span class="kw1795">std::<span class="me2">endl</span></span></a></span></span>. Even if the variable's type is rvalue reference, the expression consisting of its name is an lvalue expression;
</li><li> a function call or an overloaded operator expression, whose return type is lvalue reference, such as <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="../string/basic_string/getline.html"><span class="kw1259">std::<span class="me2">getline</span></span></a><span class="br0">(</span><a href="../io/cin.html"><span class="kw1760">std::<span class="me2">cin</span></span></a>, str<span class="br0">)</span></span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="../io/cout.html"><span class="kw1762">std::<span class="me2">cout</span></span></a> <span class="sy1">&lt;&lt;</span> <span class="nu0">1</span></span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp">str1 <span class="sy1">=</span> str2</span></span>, or <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">++</span>it</span></span>;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy1">=</span> b</span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy2">+</span><span class="sy1">=</span> b</span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy2">%</span><span class="sy1">=</span> b</span></span>, and all other built-in <a href="operator_assignment.html" title="cpp/language/operator assignment">assignment and compound assignment</a> expressions;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">++</span>a</span></span> and <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">--</span>a</span></span>, the built-in <a href="operator_incdec.html#Built-in_prefix_operators" title="cpp/language/operator incdec">pre-increment and pre-decrement</a> expressions;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy2">*</span>p</span></span>, the built-in <a href="operator_member_access.html#Built-in_indirection_operator" title="cpp/language/operator member access">indirection</a> expression;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a<span class="br0">[</span>n<span class="br0">]</span></span></span> and <span class="t-c"><span class="mw-geshi cpp source-cpp">p<span class="br0">[</span>n<span class="br0">]</span></span></span>, the built-in <a href="operator_member_access.html#Built-in_subscript_operator" title="cpp/language/operator member access">subscript</a> expressions<span class="t-rev-inl t-since-cxx11"><span>, where one operand in <span class="t-c"><span class="mw-geshi cpp source-cpp">a<span class="br0">[</span>n<span class="br0">]</span></span></span> is an array lvalue</span> <span><span class="t-mark-rev t-since-cxx11">(since C++11)</span></span></span>;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">m</span></span></span>, the <a href="operator_member_access.html#Built-in_member_access_operators" title="cpp/language/operator member access">member of object</a> expression, except where <code>m</code> is a member enumerator or a non-static member function, or where <code>a</code> is an rvalue and <code>m</code> is a non-static data member of object type;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">p<span class="sy2">-</span><span class="sy1">&gt;</span>m</span></span>, the built-in <a href="operator_member_access.html#Built-in_member_access_operators" title="cpp/language/operator member access">member of pointer</a> expression, except where <code>m</code> is a member enumerator or a non-static member function;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="sy2">*</span>mp</span></span>, the <a href="operator_member_access.html#Built-in_pointer-to-member_access_operators" title="cpp/language/operator member access">pointer to member of object</a> expression, where <code>a</code> is an lvalue and <code>mp</code> is a pointer to data member;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">p<span class="sy2">-</span><span class="sy1">&gt;</span><span class="sy2">*</span>mp</span></span>, the built-in <a href="operator_member_access.html#Built-in_pointer-to-member_access_operators" title="cpp/language/operator member access">pointer to member of pointer</a> expression, where <code>mp</code> is a pointer to data member;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a, b</span></span>, the built-in <a href="operator_other.html#Built-in_comma_operator" title="cpp/language/operator other">comma</a> expression, where <code>b</code> is an lvalue;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy4">?</span> b <span class="sy4">:</span> c</span></span>, the <a href="operator_other.html#Conditional_operator" title="cpp/language/operator other">ternary conditional</a> expression for certain <code>b</code> and <code>c</code> (e.g., when both are lvalues of the same type, but see <a href="operator_other.html#Conditional_operator" title="cpp/language/operator other">definition</a> for detail);
</li><li> a <a href="string_literal.html" title="cpp/language/string literal">string literal</a>, such as <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="st0">"Hello, world!"</span></span></span>;
</li><li> a cast expression to lvalue reference type, such as <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy3">&amp;</span><span class="sy1">&gt;</span><span class="br0">(</span>x<span class="br0">)</span></span></span>;
</li></ul>
 <table class="t-rev-begin">
<tr class="t-rev t-since-cxx11"><td>
<ul><li> a function call or an overloaded operator expression, whose return type is rvalue reference to function;
</li><li> a cast expression to rvalue reference to function type, such as <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span><span class="sy1">&lt;</span><span class="kw4">void</span> <span class="br0">(</span><span class="sy3">&amp;&amp;</span><span class="br0">)</span><span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="sy1">&gt;</span><span class="br0">(</span>x<span class="br0">)</span></span></span>.
</li></ul>
</td>
<td><span class="t-mark-rev t-since-cxx11">(since C++11)</span></td></tr>
</table>
<p>Properties:
</p>
<ul><li> Same as glvalue (below).
</li><li> Address of an lvalue may be taken by built-in address-of operator: <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">&amp;</span><span class="sy2">++</span>i</span></span><sup id="cite_ref-1" class="reference"><a href="value_category.html#cite_note-1">[1]</a></sup> and <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">&amp;</span><a href="../io/manip/endl.html"><span class="kw1795">std::<span class="me2">endl</span></span></a></span></span> are valid expressions.
</li><li> A modifiable lvalue may be used as the left-hand operand of the built-in assignment and compound assignment operators.
</li><li> An lvalue may be used to <a href="reference_initialization.html" title="cpp/language/reference initialization">initialize an lvalue reference</a>; this associates a new name with the object identified by the expression.
</li></ul>
<h4><span class="mw-headline" id="prvalue">prvalue</span></h4>
<p>The following expressions are <i>prvalue expressions</i>:
</p>
<ul><li> a <a href="expressions.html#Literals" title="cpp/language/expressions">literal</a> (except for <a href="string_literal.html" title="cpp/language/string literal">string literal</a>), such as <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="nu0">42</span></span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw2">true</span></span></span> or <span class="t-c"><span class="mw-geshi cpp source-cpp">nullptr</span></span>;
</li><li> a function call or an overloaded operator expression, whose return type is non-reference, such as <span class="t-c"><span class="mw-geshi cpp source-cpp">str.<span class="me1">substr</span><span class="br0">(</span><span class="nu0">1</span>, <span class="nu0">2</span><span class="br0">)</span></span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp">str1 <span class="sy2">+</span> str2</span></span>, or <span class="t-c"><span class="mw-geshi cpp source-cpp">it<span class="sy2">++</span></span></span>;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a<span class="sy2">++</span></span></span> and <span class="t-c"><span class="mw-geshi cpp source-cpp">a<span class="sy2">--</span></span></span>, the built-in  <a href="operator_incdec.html#Built-in_postfix_operators" title="cpp/language/operator incdec">post-increment and post-decrement</a> expressions;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy2">+</span> b</span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy2">%</span> b</span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy3">&amp;</span> b</span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy1">&lt;&lt;</span> b</span></span>, and all other built-in <a href="operator_arithmetic.html" title="cpp/language/operator arithmetic">arithmetic</a> expressions;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy3">&amp;&amp;</span> b</span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy3">||</span> b</span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">!</span>a</span></span>, the built-in <a href="operator_logical.html" title="cpp/language/operator logical">logical</a> expressions;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy1">&lt;</span> b</span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy1">==</span> b</span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy1">&gt;=</span> b</span></span>, and all other built-in <a href="operator_comparison.html" title="cpp/language/operator comparison">comparison</a> expressions;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">&amp;</span>a</span></span>, the built-in <a href="operator_member_access.html#Built-in_address-of_operator" title="cpp/language/operator member access">address-of</a> expression;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">m</span></span></span>, the <a href="operator_member_access.html#Built-in_member_access_operators" title="cpp/language/operator member access">member of object</a> expression, where <code>m</code> is a member enumerator or a non-static member function<sup id="cite_ref-pmfc_2-0" class="reference"><a href="value_category.html#cite_note-pmfc-2">[2]</a></sup><span class="t-rev-inl t-until-cxx11"><span>, or where <code>a</code> is an rvalue and <code>m</code> is a non-static data member of non-reference type</span> <span><span class="t-mark-rev t-until-cxx11">(until C++11)</span></span></span>;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">p<span class="sy2">-</span><span class="sy1">&gt;</span>m</span></span>, the built-in <a href="operator_member_access.html#Built-in_member_access_operators" title="cpp/language/operator member access">member of pointer</a> expression, where <code>m</code> is a member enumerator or a non-static member function<sup id="cite_ref-pmfc_2-1" class="reference"><a href="value_category.html#cite_note-pmfc-2">[2]</a></sup>;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="sy2">*</span>mp</span></span>, the <a href="operator_member_access.html#Built-in_pointer-to-member_access_operators" title="cpp/language/operator member access">pointer to member of object</a> expression, where <code>mp</code> is a pointer to member function<sup id="cite_ref-pmfc_2-2" class="reference"><a href="value_category.html#cite_note-pmfc-2">[2]</a></sup><span class="t-rev-inl t-until-cxx11"><span>, or where <code>a</code> is an rvalue and <code>mp</code> is a pointer to data member</span> <span><span class="t-mark-rev t-until-cxx11">(until C++11)</span></span></span>;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">p<span class="sy2">-</span><span class="sy1">&gt;</span><span class="sy2">*</span>mp</span></span>, the built-in <a href="operator_member_access.html#Built-in_pointer-to-member_access_operators" title="cpp/language/operator member access">pointer to member of pointer</a> expression, where <code>mp</code> is a pointer to member function<sup id="cite_ref-pmfc_2-3" class="reference"><a href="value_category.html#cite_note-pmfc-2">[2]</a></sup>;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a, b</span></span>, the built-in <a href="operator_other.html#Built-in_comma_operator" title="cpp/language/operator other">comma</a> expression, where <code>b</code> is an rvalue;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy4">?</span> b <span class="sy4">:</span> c</span></span>, the <a href="operator_other.html#Conditional_operator" title="cpp/language/operator other">ternary conditional</a> expression for certain <code>b</code> and <code>c</code> (see <a href="operator_other.html#Conditional_operator" title="cpp/language/operator other">definition</a> for detail);
</li><li> a cast expression to non-reference type, such as <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span><span class="sy1">&lt;</span><span class="kw4">double</span><span class="sy1">&gt;</span><span class="br0">(</span>x<span class="br0">)</span></span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="../string/basic_string.html"><span class="kw1233">std::<span class="me2">string</span></span></a><span class="br0">{</span><span class="br0">}</span></span></span>, or <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">(</span><span class="kw4">int</span><span class="br0">)</span><span class="nu0">42</span></span></span>;
</li><li> the <a href="this.html" title="cpp/language/this"><code>this</code></a> pointer;
</li><li> an <a href="enum_class.html" title="cpp/language/enum">enumerator</a>;
</li><li> non-type <a href="template_parameters.html" title="cpp/language/template parameters">template parameter</a> unless its type is <span class="t-rev-inl t-since-cxx20"><span>a class or</span> <span><span class="t-mark-rev t-since-cxx20">(since C++20)</span></span></span> an lvalue reference type;
</li></ul>
 <table class="t-rev-begin">
<tr class="t-rev t-since-cxx11"><td>
<ul><li> a <a href="lambda.html" title="cpp/language/lambda">lambda expression</a>, such as <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">[</span><span class="br0">]</span><span class="br0">(</span><span class="kw4">int</span> x<span class="br0">)</span><span class="br0">{</span> <span class="kw1">return</span> x <span class="sy2">*</span> x<span class="sy4">;</span> <span class="br0">}</span></span></span>;
</li></ul>
</td>
<td><span class="t-mark-rev t-since-cxx11">(since C++11)</span></td></tr>
<tr class="t-rev t-since-cxx20"><td>
<ul><li> a <a href="constraints.html" title="cpp/language/constraints">requires-expression</a>, such as <span class="t-c"><span class="mw-geshi cpp source-cpp">requires <span class="br0">(</span>T i<span class="br0">)</span> <span class="br0">{</span> <span class="kw1">typename</span> T<span class="sy4">::</span><span class="me2">type</span><span class="sy4">;</span> <span class="br0">}</span></span></span>;
</li><li> a specialization of a <a href="constraints.html" title="cpp/language/constraints">concept</a>, such as <span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="../concepts/equality_comparable.html"><span class="kw2953">std::<span class="me2">equality_comparable</span></span></a><span class="sy1">&lt;</span><span class="kw4">int</span><span class="sy1">&gt;</span></span></span>.
</li></ul>
</td>
<td><span class="t-mark-rev t-since-cxx20">(since C++20)</span></td></tr>
</table>
<p>Properties:
</p>
<ul><li> Same as rvalue (below).
</li><li> A prvalue cannot be <a href="objects.html#Polymorphic_objects" title="cpp/language/object">polymorphic</a>: the <a href="type-id.html#Dynamic_type" title="cpp/language/type">dynamic type</a> of the object it denotes is always the type of the expression.
</li><li> A non-class non-array prvalue cannot be <a href="cv.html" title="cpp/language/cv">cv-qualified</a><span class="t-rev-inl t-since-cxx17"><span>, unless it is <a href="implicit_cast.html#Temporary_materialization" title="cpp/language/implicit conversion">materialized</a> in order to be <a href="reference_initialization.html" title="cpp/language/reference initialization">bound to a reference</a> to a cv-qualified type</span> <span><span class="t-mark-rev t-since-cxx17">(since C++17)</span></span></span>. (Note: a function call or cast expression may result in a prvalue of non-class cv-qualified type, but the cv-qualifier is generally immediately stripped out.)
</li><li> A prvalue cannot have <a href="type-id.html#Incomplete_type" title="cpp/language/type">incomplete type</a> (except for type <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span></span></span>, see below, or when used in <a href="decltype.html" title="cpp/language/decltype"><code>decltype</code> specifier</a>)
</li><li> A prvalue cannot have <a href="abstract_class.html" title="cpp/language/abstract class">abstract class type</a> or an array thereof.
</li></ul>
<h4><span class="mw-headline" id="xvalue">xvalue</span></h4>
<p>The following expressions are <i>xvalue expressions</i>:
</p>
<ul><li> a function call or an overloaded operator expression, whose return type is rvalue reference to object, such as <span class="t-c"><span class="mw-geshi cpp source-cpp">std<span class="sy4">::</span><span class="me2">move</span><span class="br0">(</span>x<span class="br0">)</span></span></span>;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a<span class="br0">[</span>n<span class="br0">]</span></span></span>, the built-in <a href="operator_member_access.html#Built-in_subscript_operator" title="cpp/language/operator member access">subscript</a> expression, where one operand is an array rvalue;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">m</span></span></span>, the <a href="operator_member_access.html#Built-in_member_access_operators" title="cpp/language/operator member access">member of object</a> expression, where <code>a</code> is an rvalue and <code>m</code> is a non-static data member of non-reference type;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="sy2">*</span>mp</span></span>, the <a href="operator_member_access.html#Built-in_pointer-to-member_access_operators" title="cpp/language/operator member access">pointer to member of object</a> expression, where <code>a</code> is an rvalue and <code>mp</code> is a pointer to data member;
</li><li> <span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy4">?</span> b <span class="sy4">:</span> c</span></span>, the <a href="operator_other.html#Conditional_operator" title="cpp/language/operator other">ternary conditional</a> expression for certain <code>b</code> and <code>c</code> (see <a href="operator_other.html#Conditional_operator" title="cpp/language/operator other">definition</a> for detail);
</li><li> a cast expression to rvalue reference to object type, such as <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">static_cast</span><span class="sy1">&lt;</span><span class="kw4">char</span><span class="sy3">&amp;&amp;</span><span class="sy1">&gt;</span><span class="br0">(</span>x<span class="br0">)</span></span></span>;
</li></ul>
 <table class="t-rev-begin">
<tr class="t-rev t-since-cxx17"><td>
<ul><li> any expression that designates a temporary object, after <a href="implicit_cast.html#Temporary_materialization" title="cpp/language/implicit conversion">temporary materialization</a>.
</li></ul>
</td>
<td><span class="t-mark-rev t-since-cxx17">(since C++17)</span></td></tr>
</table>
<p>Properties:
</p>
<ul><li> Same as rvalue (below).
</li><li> Same as glvalue (below).
</li></ul>
<p>In particular, like all rvalues, xvalues bind to rvalue references, and like all glvalues, xvalues may be <a href="objects.html#Polymorphic_objects" title="cpp/language/object">polymorphic</a>, and non-class xvalues may be <a href="cv.html" title="cpp/language/cv">cv-qualified</a>.
</p>
<h3><span class="mw-headline" id="Mixed_categories">Mixed categories</span></h3>
<h4><span class="mw-headline" id="glvalue">glvalue</span></h4>
<p>A <i>glvalue expression</i> is either lvalue or xvalue. 
</p><p>Properties:
</p>
<ul><li> A glvalue may be implicitly converted to a prvalue with lvalue-to-rvalue, array-to-pointer, or function-to-pointer <a href="implicit_cast.html" title="cpp/language/implicit conversion">implicit conversion</a>.
</li><li> A glvalue may be <a href="objects.html#Polymorphic_objects" title="cpp/language/object">polymorphic</a>: the <a href="type-id.html#Dynamic_type" title="cpp/language/type">dynamic type</a> of the object it identifies is not necessarily the static type of the expression.
</li><li> A glvalue can have <a href="type-id.html#Incomplete_type" title="cpp/language/type">incomplete type</a>, where permitted by the expression.
</li></ul>
<h4><span class="mw-headline" id="rvalue">rvalue</span></h4>
<p>An <i>rvalue expression</i> is either prvalue or xvalue.
</p><p>Properties:
</p>
<ul><li> Address of an rvalue cannot be taken by built-in address-of operator: <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">&amp;</span><span class="kw4">int</span><span class="br0">(</span><span class="br0">)</span></span></span>, <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">&amp;</span>i<span class="sy2">++</span></span></span><sup id="cite_ref-3" class="reference"><a href="value_category.html#cite_note-3">[3]</a></sup>, <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">&amp;</span><span class="nu0">42</span></span></span>, and <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">&amp;</span>std<span class="sy4">::</span><span class="me2">move</span><span class="br0">(</span>x<span class="br0">)</span></span></span> are invalid.
</li><li> An rvalue can't be used as the left-hand operand of the built-in assignment or compound assignment operators.
</li><li> An rvalue may be used to <a href="reference_initialization.html" title="cpp/language/reference initialization">initialize a const lvalue reference</a>, in which case the lifetime of the object identified by the rvalue is <a href="reference_initialization.html#Lifetime_of_a_temporary" title="cpp/language/reference initialization">extended</a> until the scope of the reference ends.
</li></ul>
 <table class="t-rev-begin">
<tr class="t-rev t-since-cxx11"><td>
<ul><li> An rvalue may be used to <a href="reference_initialization.html" title="cpp/language/reference initialization">initialize an rvalue reference</a>, in which case the lifetime of the object identified by the rvalue is <a href="reference_initialization.html#Lifetime_of_a_temporary" title="cpp/language/reference initialization">extended</a> until the scope of the reference ends.
</li><li> When used as a function argument and when <a href="overload_resolution.html" title="cpp/language/overload resolution">two overloads</a> of the function are available, one taking rvalue reference parameter and the other taking lvalue reference to const parameter, an rvalue binds to the rvalue reference overload (thus, if both copy and move constructors are available, an rvalue argument invokes the <a href="move_constructor.html" title="cpp/language/move constructor">move constructor</a>, and likewise with copy and move assignment operators).
</li></ul>
</td>
<td><span class="t-mark-rev t-since-cxx11">(since C++11)</span></td></tr>
</table>
<h3><span class="mw-headline" id="Special_categories">Special categories</span></h3>
<h4><span class="mw-headline" id="Pending_member_function_call">Pending member function call</span></h4>
<p>The expressions <span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">mf</span></span></span> and <span class="t-c"><span class="mw-geshi cpp source-cpp">p<span class="sy2">-</span><span class="sy1">&gt;</span>mf</span></span>, where <code>mf</code> is a <a href="member_functions.html" title="cpp/language/member functions">non-static member function</a>, and the expressions <span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="sy2">*</span>pmf</span></span> and <span class="t-c"><span class="mw-geshi cpp source-cpp">p<span class="sy2">-</span><span class="sy1">&gt;</span><span class="sy2">*</span>pmf</span></span>, where <code>pmf</code> is a <a href="pointer.html#Pointers_to_member_functions" title="cpp/language/pointer">pointer to member function</a>, are classified as prvalue expressions, but they cannot be used to initialize references, as function arguments, or for any purpose at all, except as the left-hand argument of the function call operator, e.g. <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="br0">(</span>p<span class="sy2">-</span><span class="sy1">&gt;</span><span class="sy2">*</span>pmf<span class="br0">)</span><span class="br0">(</span>args<span class="br0">)</span></span></span>.
</p>
<h4><span class="mw-headline" id="Void_expressions">Void expressions</span></h4>
<p>Function call expressions returning <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span></span></span>, cast expressions to <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span></span></span>, and <a href="throw.html" title="cpp/language/throw">throw-expressions</a> are classified as prvalue expressions, but they cannot be used to initialize references or as function arguments. They can be used in discarded-value contexts (e.g. on a line of its own, as the left-hand operand of the comma operator, etc.) and in the <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">return</span></span></span> statement in a function returning <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw4">void</span></span></span>. In addition, throw-expressions may be used as the second and the third operands of the <a href="operator_other.html" title="cpp/language/operator other">conditional operator ?:</a>.
</p>
 <table class="t-rev-begin">
<tr class="t-rev t-since-cxx17"><td>
<p>Void expressions have no <i>result object</i>.
</p>
</td>
<td><span class="t-mark-rev t-since-cxx17">(since C++17)</span></td></tr>
</table>
<h4><span class="mw-headline" id="Bit_fields">Bit fields</span></h4>
<p>An expression that designates a <a href="bitfield.html" title="cpp/language/bit field">bit field</a> (e.g. <span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">m</span></span></span>, where <code>a</code> is an lvalue of type <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">struct</span> A <span class="br0">{</span> <span class="kw4">int</span> m<span class="sy4">:</span> <span class="nu0">3</span><span class="sy4">;</span> <span class="br0">}</span></span></span>) is a glvalue expression: it may be used as the left-hand operand of the assignment operator, but its address cannot be taken and a non-const lvalue reference cannot be bound to it. A const lvalue reference or rvalue reference can be initialized from a bit-field glvalue, but a temporary copy of the bit-field will be made: it won't bind to the bit field directly.
</p>
<h3><span class="mw-headline" id="History">History</span></h3>
<h4><span class="mw-headline" id="CPL">CPL</span></h4>
<p>The programming language <a href="https://en.wikipedia.org/wiki/CPL_(programming_language)" class="extiw" title="enwiki:CPL (programming language)">CPL</a> was first to introduce value categories for expressions: all CPL expressions can be evaluated in "right-hand mode", but only certain kinds of expression are meaningful in "left-hand mode". When evaluated in right-hand mode, an expression is regarded as being a rule for the computation of a value (the right-hand value, or <i>rvalue</i>). When evaluated in left-hand mode an expression effectively gives an address (the left-hand value, or <i>lvalue</i>). "Left" and "Right" here stood for "left of assignment" and "right of assignment".
</p>
<h4><span class="mw-headline" id="C">C</span></h4>
<p>The C programming language followed a similar taxonomy, except that the role of assignment was no longer significant: C expressions are categorized between "lvalue expressions" and others (functions and non-object values), where "lvalue" means an expression that identifies an object, a "locator value"<sup id="cite_ref-4" class="reference"><a href="value_category.html#cite_note-4">[4]</a></sup>.
</p>
<h4><span class="mw-headline" id="C.2B.2B98">C++98</span></h4>
<p>Pre-2011 C++ followed the C model, but restored the name "rvalue" to non-lvalue expressions, made functions into lvalues, and added the rule that references can bind to lvalues, but only references to const can bind to rvalues. Several non-lvalue C expressions became lvalue expressions in C++.
</p>
<h4><span class="mw-headline" id="C.2B.2B11">C++11</span></h4>
<p>With the introduction of move semantics in C++11, value categories were redefined to characterize two independent properties of expressions<sup id="cite_ref-5" class="reference"><a href="value_category.html#cite_note-5">[5]</a></sup>:
</p>
<ul><li> <i>has identity</i>: it's possible to determine whether the expression refers to the same entity as another expression, such as by comparing addresses of the objects or the functions they identify (obtained directly or indirectly);
</li><li> <i>can be moved from</i>: <a href="move_constructor.html" title="cpp/language/move constructor">move constructor</a>, <a href="move_operator.html" title="cpp/language/move assignment">move assignment operator</a>, or another function overload that implements move semantics can bind to the expression.
</li></ul>
<p>In C++11, expressions that:
</p>
<ul><li> have identity and cannot be moved from are called <i>lvalue</i> expressions;
</li><li> have identity and can be moved from are called <i>xvalue</i> expressions;
</li><li> do not have identity and can be moved from are called <i>prvalue</i> ("pure rvalue") expressions;
</li><li> do not have identity and cannot be moved from are not used<sup id="cite_ref-6" class="reference"><a href="value_category.html#cite_note-6">[6]</a></sup>.
</li></ul>
<p>The expressions that have identity are called "glvalue expressions" (glvalue stands for "generalized lvalue"). Both lvalues and xvalues are glvalue expressions.
</p><p>The expressions that can be moved from are called "rvalue expressions". Both prvalues and xvalues are rvalue expressions.
</p>
<h4><span class="mw-headline" id="C.2B.2B17">C++17</span></h4>
<p>In C++17, <a href="copy_elision.html" title="cpp/language/copy elision">copy elision</a> was made mandatory in some situations, and that required separation of prvalue expressions from the temporary objects initialized by them, resulting in the system we have today. Note that, in contrast with the C++11 scheme, prvalues are no longer moved from.
</p>
<h3><span class="mw-headline" id="Footnotes">Footnotes</span></h3>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="value_category.html#cite_ref-1">↑</a></span> <span class="reference-text">Assuming <span class="t-c"><span class="mw-geshi cpp source-cpp">i</span></span> has built-in type or the pre-increment operator is <a href="operators.html" title="cpp/language/operators">overloaded</a> to return by lvalue reference.</span>
</li>
<li id="cite_note-pmfc-2"><span class="mw-cite-backlink">↑ <sup><a href="value_category.html#cite_ref-pmfc_2-0">2.0</a></sup> <sup><a href="value_category.html#cite_ref-pmfc_2-1">2.1</a></sup> <sup><a href="value_category.html#cite_ref-pmfc_2-2">2.2</a></sup> <sup><a href="value_category.html#cite_ref-pmfc_2-3">2.3</a></sup></span> <span class="reference-text">Special rvalue category, see <a href="value_category.html#Pending_member_function_call">pending member function call</a>.</span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><a href="value_category.html#cite_ref-3">↑</a></span> <span class="reference-text">Assuming <span class="t-c"><span class="mw-geshi cpp source-cpp">i</span></span> has built-in type or the postincrement operator is not <a href="operators.html" title="cpp/language/operators">overloaded</a> to return by lvalue reference.</span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><a href="value_category.html#cite_ref-4">↑</a></span> <span class="reference-text">"A difference of opinion within the C community centered around the meaning of lvalue, one group considering an lvalue to be any kind of object locator, another group holding that an lvalue is meaningful on the left side of an assigning operator. The C89 Committee adopted the definition of lvalue as an object locator." -- ANSI C Rationale, 6.3.2.1/10.</span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><a href="value_category.html#cite_ref-5">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.stroustrup.com/terminology.pdf">"New" Value Terminology</a> by Bjarne Stroustrup, 2010.</span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><a href="value_category.html#cite_ref-6">↑</a></span> <span class="reference-text">const prvalues (only allowed for class types) and const xvalues do not bind to T&amp;&amp; overloads, but they bind to the const T&amp;&amp; overloads, which are also classified as "move constructor" and "move assignment operator" by the standard, satisfying the definition of "can be moved from" for the purpose of this classification. However, such overloads cannot modify their arguments and are not used in practice; in their absence const prvalues and const xvalues bind to const T&amp; overloads.</span>
</li>
</ol>
<h3><span class="mw-headline" id="Defect_reports">Defect reports</span></h3>
<p>The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
</p>
<table class="dsctable" style="font-size:0.8em">
<tr>
<th> DR
</th>
<th> Applied to
</th>
<th> Behavior as published
</th>
<th> Correct behavior
</th></tr>
<tr>
<td> <a rel="nofollow" class="external text" href="https://cplusplus.github.io/CWG/issues/616.html">CWG 616</a>
</td>
<td> C++11
</td>
<td> member access and member access through<br>pointer to member of an rvalue resulted in prvalue
</td>
<td> reclassified as xvalue
</td></tr>
<tr>
<td> <a rel="nofollow" class="external text" href="https://cplusplus.github.io/CWG/issues/1059.html">CWG 1059</a>
</td>
<td> C++11
</td>
<td> array prvalues could not be cv-qualified
</td>
<td> allowed
</td></tr>
<tr>
<td> <a rel="nofollow" class="external text" href="https://cplusplus.github.io/CWG/issues/1213.html">CWG 1213</a>
</td>
<td> C++11
</td>
<td> subscripting an array rvalue resulted in  lvalue
</td>
<td> reclassified as xvalue
</td></tr></table>
<h3><span class="mw-headline" id="See_also">See also</span></h3>
<table class="t-dsc-begin">

</table>
<h3><span class="mw-headline" id="External_links"> External links </span></h3>
<ul><li> David Mazières, 2021 - <a rel="nofollow" class="external text" href="https://www.scs.stanford.edu/~dm/blog/decltype.html">C++ value categories and decltype demystified</a>
</li></ul>

<!-- 
NewPP limit report
Preprocessor visited node count: 6758/1000000
Preprocessor generated node count: 12467/1000000
Post‐expand include size: 177432/2097152 bytes
Template argument size: 27265/2097152 bytes
Highest expansion depth: 15/40
Expensive parser function count: 0/100
-->

<!-- Saved in parser cache with key mwiki1-mwiki_en_:pcache:idhash:4706-0!*!0!!en!*!* and timestamp 20220616192650 -->
</div>                    <!-- /bodycontent -->
                                        <!-- printfooter -->
                    <div class="printfooter">
                    Retrieved from "<a href="https://en.cppreference.com/mwiki/index.php?title=cpp/language/value_category&amp;oldid=140338">https://en.cppreference.com/mwiki/index.php?title=cpp/language/value_category&amp;oldid=140338</a>"                    </div>
                    <!-- /printfooter -->
                                                            <!-- catlinks -->
                    <!-- /catlinks -->
                                                            <div class="visualClear"></div>
                    <!-- debughtml -->
                                        <!-- /debughtml -->
                </div>
                <!-- /bodyContent -->
            </div>
        </div>
        <!-- /content -->
        <!-- footer -->
        <div id="cpp-footer-base" class="noprint">
            <div id="footer">
                        <div id="cpp-navigation">
            <h5>Navigation</h5>
            <ul><li><a href="https://en.cppreference.com/w/cpp/language/value_category">Online version</a></li><li>Offline version retrieved 2022-07-30 14:05.</li></ul></div>
                        <ul id="footer-info">
                                    <li id="footer-info-lastmod"> This page was last modified on 16 June 2022, at 12:26.</li>
                                    <li id="footer-info-viewcount">This page has been accessed 790,067 times.</li>
                            </ul>
                    </div>
        </div>
        <!-- /footer -->
        <script>if(window.mw){
mw.loader.state({"site":"loading","user":"missing","user.groups":"ready"});
}</script>
<script src="../../../common/skin_scripts.js"></script>
<script>if(window.mw){
mw.loader.load(["mediawiki.action.view.postEdit","mediawiki.user","mediawiki.page.ready","mediawiki.searchSuggest","mediawiki.hidpi","ext.gadget.ColiruCompiler","ext.gadget.MathJax"], null, true);
}</script>
<script src="../../../common/site_scripts.js"></script>
<script type="text/javascript">
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-2828341-1']);
_gaq.push(['_setDomainName', 'cppreference.com']);
_gaq.push(['_trackPageview']);
</script><!-- Served in 0.041 secs. -->
	</body>
<!-- Cached 20220616192813 -->
</html>